package pl.koszolko.documentclustering.cluster.quality;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import pl.koszolko.documentclustering.cluster.Cluster;
import pl.koszolko.documentclustering.cluster.document.DocumentForClustering;

/**
 * Oblicza jakosc grupowania na podstawie wskaznika Purity
 * @author Wojtek
 *
 */
public class PurityQualityHelper implements QualityMeasurementHelper {

	@Override
	public double  measureQuality(final List<Cluster> finalClusters) {
		int numberOfAllClusteredObject = 0;
		int puritySum = 0;
		
		for (Cluster cluster : finalClusters) {
			numberOfAllClusteredObject += cluster.getDocuments().size();

			//ustalenie liczby dokumentow danej klasy w pojedynczym klastrze
			Map<String, Integer> numberOfDocumentsPerClass = new HashMap<String, Integer>();
			for (DocumentForClustering doc : cluster.getDocuments()) {
				String documentClass = doc.getDocumentClass();
				Integer numberOfDocument = numberOfDocumentsPerClass
						.get(documentClass);
				if (numberOfDocument != null) {
					numberOfDocumentsPerClass.put(documentClass,
							numberOfDocument + 1);
				} else {
					numberOfDocumentsPerClass.put(documentClass, 1);
				}
			}
			
			//wyzaczenie maksymalnej liczby dokumentow tej samej klasy
			int maxNumberOfDocumentTheSameClass = 0;
			for(String documentClass : numberOfDocumentsPerClass.keySet()) {
				int numberOfDocumentPerClass = numberOfDocumentsPerClass.get(documentClass);
				if(numberOfDocumentPerClass>maxNumberOfDocumentTheSameClass) {
					maxNumberOfDocumentTheSameClass = numberOfDocumentPerClass;
				}
			}
			
			puritySum += maxNumberOfDocumentTheSameClass;			
		}

		return puritySum/(double)numberOfAllClusteredObject * 100;
	}

}